home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / PWABFV20.ZIP / FLAG.PPS < prev    next >
Encoding:
Text File  |  1995-02-19  |  14.9 KB  |  452 lines

  1. ;
  2. ; Patched for use with BlackCat viewer 2.0
  3. ;
  4. ;******************************************************************************
  5. ;  FLAG.PPE version 3.0 released on 12/18/93 by David W. Terry
  6. ;
  7. ; FLAG.PPE is a replacement for PCBoard's internal "more?" prompt, gives
  8. ; PCBoard v15.1 the easiest-to-use system for flagging and viewing files of
  9. ; any BBS around.  It gives callers the ability to point and shoot when
  10. ; flagging or viewing files.
  11. ;
  12. ; NOTE:  Please DO NOT DISTRIBUTE modified source code without prior permission
  13. ; or without meeting the requirements set forth in FLAG.DOC.
  14. ;******************************************************************************
  15.  
  16. ' check to see if caller has ANSI capabilities and, if not, display the old
  17. ' prompt and exit - let PCBoard handle the input.
  18.  
  19. ;***********************************************************************
  20.  
  21. IF (! ANSION()) THEN
  22.   DISPFILE PPEPATH()+"FLAGOLD",LANG
  23.   END
  24. ENDIF
  25.  
  26. BOOLEAN exitflag       ' Flag to determine when we should exit
  27. BOOLEAN rip            ' Flag to indicate RIPscrip is in use
  28.  
  29. STRING  text           ' The text that the caller types
  30. STRING  key            ' Keystroke text
  31.  
  32. STRING  BS             ' An ASCII backspace character
  33. STRING  BS2            ' An ASCII backspace character
  34. STRING  CR             ' An ASCII carriage return character
  35. STRING  ESC            ' An ASCII esc character
  36.  
  37. BYTE    len            ' Length of the text the caller has typed
  38. BYTE    oldy           ' Last row position of cursor
  39. BYTE    newy           ' New row position of cursor
  40.  
  41. STRING  filenames(23)  ' The names of the files found on the screen
  42. STRING  filename       ' The name of the file that is being processed
  43. STRING  fileimage      ' Includes the color codes for restoration of text
  44.  
  45. ;***********************************************************************
  46.  
  47. ; Initializations
  48.  
  49. BS     = CHR(8)   ' Backspace Key
  50. BS2    = CHR(127) ' Alternate Backspace Key
  51. CR     = CHR(13)  ' Carriage Return
  52. ESC    = CHR(27)  ' ESC character
  53. len    = 0        ' Initialize to 0 bytes in the input buffer
  54. text   = ""       ' Initialize to an empty input buffer
  55.  
  56. ;***********************************************************************
  57.  
  58. ; Main Program
  59.  
  60.                              ' in case the last invocation of flag.ppe saved
  61. RESTSCRN                     ' the screen, restore it now
  62.  
  63. CLREOL                       ' clear the line for input
  64. GOSUB displayprompt          ' display the new prompt
  65. GOSUB scanforfiles           ' build filenames array
  66.  
  67. ' While the user hasn't exited, get keystrokes and act on them.
  68. ' Exiting will occur when the caller presses ENTER.
  69.  
  70. WHILE (!exitflag) DO
  71.  
  72.   key = INKEY()  ' Get a keypress from the user
  73.  
  74.   if (key <> "") THEN  ' If the user pressed a key, then let's process it
  75.  
  76.     ' If it is the FIRST keystroke, signified by the buffer having 0 bytes
  77.     ' in it, then check to see if it is a SPACE.  If so, then we'll go into
  78.     ' MARK mode.  If not, then we'll process the keystrokes the same way that
  79.     ' PCBoard would .. gathering them up into a buffer.  Once the ENTER key
  80.     ' is pressed, we'll exit out and stuff PCBoard's keyboard buffer with the
  81.     ' keystrokes that were collected.
  82.  
  83.     IF (len = 0 & key = " ") THEN
  84.       oldy = GETY()
  85.       newy = 0
  86.  
  87.       PRINT CR
  88.       CLREOL
  89.       PRINT ESC+"[s"  ' save the current cursor position
  90.  
  91.       ' Let the caller know what he can do while in MARK mode
  92.       DISPFILE PPEPATH()+"FLAGBAR",GRAPH+LANG
  93.  
  94.       ' Move the cursor back to the first column
  95.       PRINT CR
  96.  
  97.       ' Find the first filename on the screen.
  98.       GOSUB findfile
  99.  
  100.       ' If a filename was found, then findfile highlighted it.  Now wait for
  101.       ' another keystroke to see if the user whats to mark this one, or move
  102.       ' on to another one, or exit out.  Marking is done by pressing ENTER,
  103.       ' moving to another file is done by pressing SPACE, viewing the file is
  104.       ' done by pressing "V", and exiting is done by pressing ESC.
  105.  
  106.       IF (filename <> "") THEN
  107.         WHILE (key != ESC & key != CR & UPPER(key) != "V") DO
  108.           key = INKEY()
  109.  
  110.           ' If the key pressed was a SPACE then the user has decided to skip
  111.           ' over that file.  So unhighlight it, then try to find another
  112.           ' file.  If a file is found, we'll stay in this loop.  If one is
  113.           ' not found, then we'll restore the original prompt and go back to
  114.           ' waiting for keystrokes in case the caller wants to start over
  115.           ' (marking files) or wants to manually (F)lag them instead.
  116.  
  117.           IF (key = " ") THEN
  118.             GOSUB unhighlight
  119.             GOSUB findfile
  120.             IF (filename = "") THEN
  121.               GOSUB restorecursor
  122.               GOSUB displayprompt
  123.               GOTO  bottom
  124.             ENDIF
  125.           ENDIF
  126.         ENDWHILE
  127.  
  128.         ' If we've gotten this far, then ESC, CR or V was pressed.  We'll
  129.         ' unhighlight the file, restore the prompt and then, if CR was pressed,
  130.         ' meaning the user wished to MARK that file, then will stuff PCBoard's
  131.         ' keyboard buffer with a FLAG command and the name of the file to flag.
  132.         ' If V was pressed, then we'll instead stuff the buffer with a command
  133.         ' to VIEW the file.
  134.  
  135.         GOSUB unhighlight
  136.         GOSUB restorecursor
  137.  
  138.         IF (key = CR) THEN
  139.           KBDSTUFF "F "+filename+CR
  140.           END
  141.         ELSEIF (UPPER(key) = "V") THEN
  142.           ' save the screen into PCBoard's memory so that we can restore it
  143.           ' when FLAG.PPE is called up again, then issue the view command
  144.           SAVESCRN
  145.       ; BLACKCAT viewer start
  146.           ;KBDSTUFF "V "+filename+CR 
  147.           KBDSTUFF "F "+ CR + "/VIEW" + CR + filename + CR
  148.       ;BLACKCAT viewer end
  149.           END
  150.         ENDIF
  151.       ELSE
  152.         GOSUB restorecursor
  153.       ENDIF
  154.  
  155.       GOSUB displayprompt
  156.       CONTINUE
  157.  
  158.     ELSEIF (key == BS | key == BS2) THEN
  159.  
  160.       ' If the caller pressed backspace or delete, then delete the character
  161.       ' to the left, and remove it from the input buffer.  Of course, if the
  162.       ' caller hasn't typed anything yet, or if the caller has already
  163.       ' backspaced everything out, signified by the len being 0 (meaning there
  164.       ' are 0 bytes in the buffer), then we'll just loop back around waiting
  165.       ' for more keystrokes
  166.  
  167.       IF (len > 0) THEN
  168.         PRINT BS+" "
  169.         len  = len - 1
  170.         text = LEFT(text,len)
  171.       ELSE
  172.         CONTINUE
  173.       ENDIF
  174.  
  175.     ELSEIF (key == CR) THEN
  176.  
  177.       ' If it's a carriage return then set the flag to exit
  178.       exitflag = TRUE
  179.  
  180.     ELSEIF (LEN(key) > 1 | key < " ") THEN
  181.  
  182.       ' Special keys, such as UP, DOWN, etc, return multi-letter values such
  183.       ' as "UP" and "DOWN" when the INKEY() function is called.  Since we just
  184.       ' want to ignore special characters, we'll use the CONTINUE statement to
  185.       ' jump back to the top of the loop
  186.       '
  187.       ' We also want to avoid displaying "control characters" so anything
  188.       ' less than a SPACE should also be skipped.
  189.  
  190.       CONTINUE
  191.  
  192.     ELSEIF ((len = 0) & ((key = "?") | (UPPER(key) = "H"))) THEN
  193.  
  194.       ' If the user typed "?" or "H" then we want to display a help file.
  195.       ' First we'll save the current screen, then display the help file, and
  196.       ' then restore the saved screen after the caller has read the help file.
  197.  
  198.       SAVESCRN
  199.       NEWLINE
  200.       DISPFILE PPEPATH()+"FLAGHLP",GRAPH+LANG
  201.       NEWLINE
  202.       WAIT
  203.       RESTSCRN
  204.       CONTINUE
  205.  
  206.     ELSEIF ((key >= " ") & (len < 80)) THEN
  207.  
  208.       ' Here we are just gathering up keystrokes and putting them into an
  209.       ' input buffer.  As long as the keystrokes are greater than or equal to
  210.       ' a SPACE we'll just add them in until a limit of 80 characters is
  211.       ' reached.  PCBoard won't let you type more than 80 characters at that
  212.       ' prompt anyway so we might as well keep the same limit.
  213.  
  214.       text = text + key
  215.       len  = len + 1
  216.  
  217.     ENDIF
  218.  
  219.     PRINT key    ' Print any keystrokes the caller types
  220.   ENDIF
  221.  
  222. :bottom
  223. ENDWHILE
  224.  
  225. ' If we've gotten this far, then the caller has pressed ENTER so we'll stuff
  226. ' whatever the caller has typed into PCBoard's input buffer and let PCBoard
  227. ' process the request.
  228. '
  229. ' But first, if the command begins with V then it may be a view files command.
  230. ' Verify that assumption by checking to see if the user typed "V" and pressed
  231. ' ENTER (check length equal to 1) or if the user typed "V filename" (check
  232. ' for length greater than or equal to 3 for "F f")
  233.  
  234. text = RTRIM(text," ")
  235.  
  236. IF (UPPER(LEFT(text,1)) = "V") THEN
  237.   IF (LEN(text) = 1) THEN
  238.     CLREOL
  239.     filename = ""
  240.     ; blackcat viewer start
  241.     ;PROMPTSTR 240,filename,12,MASK_FILE(),FIELDLEN
  242.     inputstr "@X07Filename to view (enter=none)", filename, 7, 12, mask_file(), fieldlen
  243.     ;blackcat viewer end
  244.     filename = RTRIM(filename," ");
  245.     IF (LEN(filename) = 0) THEN
  246.       CLREOL
  247.       KBDSTUFF CR
  248.       END
  249.     ENDIF
  250.     NEWLINE
  251.  
  252.     ' the lines below could be used to specify a different "default extension"
  253.     ' for archive files in different conferences - uncomment and adapt as
  254.     ' necessary to suit your needs
  255.     '
  256.     ' IF (INSTR(filename,".") = 0) THEN
  257.     '   IF (CURCONF() = 30) THEN
  258.     '     filename = filename + ".ARJ"
  259.     '   ELSEIF (CURCONF() = 50) THEN
  260.     '     filename = filename + ".ZOO"
  261.     '   ENDIF
  262.     ' ENDIF
  263.  
  264.     ;BlackCAT viewer start
  265.     ;text = "V " + filename
  266.     text = "F "+ CR + "/VIEW" + CR + filename
  267.     ;BlackCAT viewer end
  268.     ' save the screen to PCBoard's memory so that the next invocation of
  269.     ' FLAG.PPE will restore the screen
  270.     SAVESCRN
  271.   ELSEIF (LEN(text) >= 3) THEN
  272.     ' save the screen to PCBoard's memory so that the next invocation of
  273.     ' FLAG.PPE will restore the screen
  274.     CLREOL
  275.  
  276.     ' the lines below could be used to specify a different "default extension"
  277.     ' for archive files in different conferences - uncomment and adapt as
  278.     ' necessary to suit your needs
  279.     '
  280.     ' IF (INSTR(filename,".") = 0) THEN
  281.     '   IF (CURCONF() = 30) THEN
  282.     '     text = text + ".ARJ"
  283.     '   ELSEIF (CURCONF() = 50) THEN
  284.     '     text = text + ".ZOO"
  285.     '   ENDIF
  286.     ' ENDIF
  287.  
  288.     ;blackcat viewer start
  289.     text = "F " + CR + "/VIEW" + CR + mid(text, 2, len(text) - 1)
  290.     ;blackcat viewer end
  291.     SAVESCRN
  292.   ELSE
  293.     KBDSTUFF CR
  294.     END
  295.   ENDIF
  296. ENDIF
  297.  
  298. KBDSTUFF text+CR
  299. END
  300.  
  301.  
  302. ;***********************************************************************
  303. '
  304. ' This subroutine restores the cursor position.  It does this using an ANSI
  305. ' command that simply restores a previously saved cursor position.  In
  306. ' addition, we'll clear the line before returning.
  307.  
  308. :restorecursor
  309. PRINT ESC+"[u"
  310. CLREOL
  311. RETURN
  312.  
  313.  
  314. ;***********************************************************************
  315. '
  316. ' This is a subroutine that displays the new prompt and then sets the color to
  317. ' the default for input.
  318.  
  319. :displayprompt
  320. DISPFILE PPEPATH()+"FLAGNEW",LANG
  321. DEFCOLOR
  322. RETURN
  323.  
  324.  
  325. ;***********************************************************************
  326. '
  327. ' This is a subroutine that checks the filenames() array to locate the next
  328. ' file on screen.  If RIPscrip is used, then special commands (which are
  329. ' passed via a mouse-click from the caller's terminal, are used to identify
  330. ' which file is desired.
  331. '
  332. ' If a valid filename is found, it is stored in a variable called filename.
  333. ' Also, it calls another subroutine to highlight the filename on the screen.
  334.  
  335. :findfile
  336. IF (rip) THEN
  337.   newy = 0
  338.   key = ""
  339.   WHILE (newy = 0) DO
  340.     key = INKEY()      ' watch for the next character
  341.     newy = ASC(key)
  342.     IF (newy >= 129 & newy <= 151) THEN
  343.       newy = newy - 128
  344.       IF (filenames(newy) <> "") THEN
  345.         GOSUB highlight
  346.         filename = filenames(newy)
  347.         RETURN
  348.       ELSE
  349.         newy = 0
  350.       ENDIF
  351.     ENDIF
  352.   ENDWHILE
  353. ELSE
  354.   WHILE (newy < oldy) DO
  355.     newy = newy + 1
  356.     IF (filenames(newy) <> "") THEN
  357.       GOSUB highlight
  358.       filename = filenames(newy)
  359.       RETURN
  360.     ENDIF
  361.   ENDWHILE
  362. ENDIF
  363.  
  364. ' no valid filename was found, return with an empty filename
  365. filename = ""
  366. RETURN
  367.  
  368.  
  369. ;***********************************************************************
  370. '
  371. ' This is a subroutine that highlights the filename moving the cursor to the
  372. ' correct line and then changing the color to black on white and printing the
  373. ' filename.  Prior to highlighting the filename, it saves a color image of the
  374. ' filename so that, when it comes time to unhighlight the file, the image can
  375. ' be restored.
  376.  
  377. :highlight
  378. ' move the cursor back to where it started, at the bottom, and then move
  379. ' it up to the appropriate line on the screen.
  380. PRINT ESC+"[u"+ESC+"["+STRING(oldy-newy)+"A"
  381.  
  382. ' get the file image (text & attributes) for later restoration
  383. fileimage = SCRTEXT(1,newy,13,TRUE)
  384.  
  385. ' then highlight the filename and return
  386. COLOR @X70
  387. PRINT filenames(newy)+CR
  388. RETURN
  389.  
  390.  
  391. ;***********************************************************************
  392. '
  393. ' This is a subroutine that unhighlights the filename by printing the file
  394. ' image, which includes color codes as well as the filename.
  395.  
  396. :unhighlight
  397. PRINT fileimage+CR
  398. RETURN
  399.  
  400.  
  401. ;***********************************************************************
  402. '
  403. ' This subroutine scans the screen at startup to see and fills an array called
  404. ' filenames() with the names of all files found on screen.  If RIPscrip is in
  405. ' use, it will also send out RIPscrip commands to define the location of the
  406. ' filenames on screen so that the caller can use a mouse to point and click.
  407.  
  408. :scanforfiles
  409. IF (GRAFMODE() = "R") THEN
  410.   rip = TRUE
  411. ENDIF
  412.  
  413. ' NOTE:  This loop is unnecessary because PPL automatically initializes
  414. '        all array elements to 0 or blank
  415. '
  416. ' FOR newy=1 TO 23
  417. '   filenames(newy) = ""   ' initialize the array elements
  418. ' NEXT
  419.  
  420. newy = 1
  421. WHILE (newy > 0) DO
  422.   ' get a filename off the screen ... if a filename is found, the filename
  423.   ' variable will be updated, if no more filenames are found, newy will be
  424.   ' set to 0.
  425.   SCRFILE newy, filename
  426.  
  427.   IF (newy <> 0) THEN
  428.     ' store the filename that was found into an array
  429.     filenames(newy) = filename
  430.  
  431.     ' If in RIPscrip mode, define the mouse region where the filename is
  432.     ' located.  The coordinates are defined in X,Y coordinates of 0,newy and
  433.     ' 13,newy+1.  The X coordinate (0 to 13) defines the length of the name.
  434.     ' The Y coordinate (newy to newy+1) defines the height of the name.
  435.     ' An 8x8 font is assumed.  The CHR(newy+128) is a "command" that we will
  436.     ' be using to communicate back to FLAG.PPE the position of the file being
  437.     ' selected via mouse click.
  438.     IF (rip) THEN
  439.       MOUSEREG 0,1,newy,13,newy+1,8,8,TRUE,FALSE," "+CHR(newy+128)
  440.     ENDIF
  441.     INC newy
  442.   ENDIF
  443. ENDWHILE
  444.  
  445. ' finish up the mouse region definitions
  446. IF (rip) THEN
  447.   MPRINT "!|#|#|#"+CR+chr(10)
  448. ENDIF
  449. RETURN
  450.  
  451. ;***********************************************************************
  452.